#ifndef DEVICEMANAGEMENTWIDGET_H
#define DEVICEMANAGEMENTWIDGET_H

#include <QWidget>
#include <QString>
#include <QButtonGroup>
#include <QAbstractButton>
#include "SDKManager.h"

// 不再使用外部静态函数，使用类成员变量和方法管理对话框

QT_BEGIN_NAMESPACE
namespace Ui { class DeviceManagementWidget; }
QT_END_NAMESPACE


/**
 * @class DeviceManagementWidget
 * @brief 设备管理界面类，负责相机和控制模块的连接管理、参数设置和触发控制
 * 
 * 该类提供了用户界面，用于管理相机和控制模块的连接状态，
 * 调整相机和控制模块的参数，并控制各种触发模式。
 */
class DeviceManagementWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param cameraManager 相机管理器指针
     * @param controlModuleManager 控制模块管理器指针
     * @param parent 父窗口指针
     */
    explicit DeviceManagementWidget(SDKManager *sdkManager,QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~DeviceManagementWidget();

    //捕获图像完成时触发该方法，用于更新按钮显示状态
    void getImageComplete();

public slots:

    /**
     * @brief 刷新设备按钮点击事件处理
     *
     * 重新发现相机和控制模块设备，更新设备列表。
     */
    void on_refreshDevicesButton_clicked();
    
    /**
     * @brief 设置外部相机参数设置界面
     * @param widget 相机参数设置界面组件
     * 
     * 设置用于相机参数调整的外部UI组件，替换内部控件。
     */
    void setCameraParametersWidget(QWidget *widget);
    
    /**
     * @brief 设置外部控制模块参数设置界面
     * @param widget 控制模块参数设置界面组件
     * 
     * 设置用于控制模块参数调整的外部UI组件，替换内部控件。
     */
    void setControlModuleParametersWidget(QWidget *widget);
    
    /**
     * @brief 设置外部相机参数对话框
     * @param dialog 相机参数对话框指针
     * 
     * 设置用于相机参数调整的外部对话框，供按钮点击时显示。
     */
    void setExternalCameraParametersDialog(QWidget *dialog);
    
    /**
     * @brief 设置外部控制模块参数对话框
     * @param dialog 控制模块参数对话框指针
     * 
     * 设置用于控制模块参数调整的外部对话框，供按钮点击时显示。
     */
    void setExternalControlModuleParametersDialog(QWidget *dialog);

private slots:
    // UI更新相关槽函数
    /**
     * @brief 更新连接状态UI
     * 
     * 根据相机和控制模块的连接状态更新UI显示，包括连接状态图标、
     * 按钮文本和各种控件的启用状态。
     */
    void updateConnectionUI();
    
    /**
     * @brief 更新触发按钮状态
     * 
     * 根据相机和控制模块的连接状态启用或禁用触发按钮。
     */
    void updateTriggerButtonsState();


private slots:
    // 相机连接相关槽函数
    /**
     * @brief 相机连接按钮点击事件处理
     * 
     * 根据当前连接状态，执行相机的连接或断开操作。
     */
    void onConnectCameraButtonClicked();
    
    /**
     * @brief 相机连接成功槽函数
     * 
     * 当相机连接成功时被调用，更新连接状态并刷新UI。
     */
    void onCameraConnected();
    
    /**
     * @brief 相机断开连接槽函数
     * 
     * 当相机断开连接时被调用，更新连接状态并刷新UI。
     */
    void onCameraDisconnected();

    /**
     * @brief 控制模块连接按钮点击事件处理
     * 
     * 根据当前连接状态，执行控制模块的连接或断开操作。
     */
    void onConnectControlModuleButtonClicked();
    
    /**
     * @brief 控制模块连接成功槽函数
     * 
     * 当控制模块连接成功时被调用，更新连接状态并刷新UI。
     */
    void onControlModuleConnected();
    
    /**
     * @brief 控制模块断开连接槽函数
     * 
     * 当控制模块断开连接时被调用，更新连接状态并刷新UI。
     */
    void onControlModuleDisconnected();

    /**
     * @brief SK设置按钮点击事件处理
     *
     * 创建并显示SK功能设置对话框。
     */
    void onSKSetButtonClicked();

    /**
     * @brief 相机设置按钮点击事件处理
     *
     * 创建并显示相机触发设置对话框。
     */
    void onCameraSetButtonClicked();

    /**
     * @brief 触发模式变化事件处理
     * @param mode 新的触发模式（`TRIGGER_MODE_*` 常量）
     * 
     * 当触发模式变化时被调用，根据不同的触发模式执行相应的设置。
     */
    void onTriggerModeChanged(int mode);


    void updateControllerBtn(QPushButton  *btn);

private:
    Ui::DeviceManagementWidget *ui; ///< UI对象指针
    bool m_cameraConnected; ///< 相机连接状态标志
    bool m_controlModuleConnected; ///< 控制模块连接状态标志
    int m_triggerMode; ///< 触发模式
    QString m_ConnectCameraId; ///< 连接相机ID
    QString m_ConnectControlModuleId; ///< 连接控制模块ID

    // 外部UI组件指针
    QWidget *m_cameraParametersWidget; ///< 外部相机参数设置界面
    QWidget *m_controlModuleParametersWidget; ///< 外部控制模块参数设置界面
    
    // 外部对话框指针
    QWidget *m_cameraParametersDialog; ///< 外部相机参数对话框
    QWidget *m_controlModuleParametersDialog; ///< 外部控制模块参数对话框
    
    // 设备管理器
    SDKManager * m_SDKManager;

    //统一管理控制按钮组
    QPushButton* m_LastClickedBtn = nullptr;
};

#endif // DEVICEMANAGEMENTWIDGET_H
